不知道大家有沒有聽過負載均衡或者水平擴展呢?在網站佈署中我們會透過這些技術把網站架在多台 server 上,以避免萬一某台 server 掛掉,讓網頁服務仍能維持運作,或者去分擔負載
MongoDB 這邊有一個叫資料庫複製的技術,建立多個相同的 MongoDB service 在不同的 server 上,以避免萬一某台 server 掛掉,讓資料庫無法使用
在資料庫複製中,每個 server 會擔任不同的成員角色,主要分成三種,分別是 primary, secondary 以及仲裁者
在這些角色中只有 primary 會和後端溝通,secondary 的功能是同步 primary 的資料,以及當 primary 掛掉的時候,其中一個 secondary 會遞補上來成為 primary,而仲裁者的功能只有當 primary 掛掉的時候參與投票決定哪個 secondary 成為 primary
仲裁者不會同步 primary 的資料,通常由效能較差或者儲存空間較少的 server 擔任,不然如果這台 server 夠好的話,就讓他當 seondary 就好啦
當 primary 掛掉時,seondary 和仲裁者會舉行投票,決定由哪個 secondary 來擔任 primary,secondary 的得票數必須過半才能成為 primary
在 mongod.cfg
中,我們加入以下設定
replication:
replSetName: "replica_set_name"
在所有的 server 都必須加入相同的 replication
設定
我們先進到其中一台 server 的 mongo shell,輸入以下指令開啟資料庫複製功能
rs.initiate()
加入 secondary
rs.add(“[ip]:[port]”)
加入仲裁者
rs.addArb(“[ip]:[port]”)
python 這邊連接 MongoDB 要改成像這樣,連線到所有在資料庫複製集中的 server
myclient = pymongo.MongoClient("mongodb://192.168.0.1:27017,192.168.0.2:27017,192.168.0.3:27017")
從最一開始到以上的內容,基本上都是讓 MongoDB service 在網路上裸奔的狀態,別人只要知道你的 MongoDB service 架在哪個 ip 和 port 就可以操作你的資料庫了,所以我們要來設置資料庫使用者的帳號密碼
MongoDB 這邊可以建立不同權限的使用者,可以讓有的使用者只讀不寫,也可以讓某個使用者只能操作某幾個 database
這邊我直接介紹建立一個 root 使用者,什麼都可以做,在 mongo shell 中
$ use admin
$ db.createUser( { user: “superuser”, pwd: “yourpwd”, roles: [ { role: “root”, db: “admin” } ] } )
設定 role
是 root
在 mongod.cfg
中,我們加入以下設定
security:
authorization: enabled
現在用 python 連線要改成像這樣
db_root_user='superuser'
db_root_password='yourpwd'
db_host='192.168.0.1:27017,192.168.0.2:27017,192.168.0.2:27017'
myclient = pymongo.MongoClient('mongodb://'+db_root_user+':'+db_root_password+'@'+db_host+'/?authSource=admin')